Первое, что мы сделаем это объявим константы
#define LANANUM 000 // Адрес LANA #define LOCALNAME "MYNET" // Моё имя #define MAX_SESSION 20 // Максимальное количество имен #define MAX_NAMES 30Инициализируем NetBios по конкретному LANA используя команду NCBRESET
NCB ncb;
UCHAR uRetCode;
memset (&ncb, 0, sizeof (ncb));
//---------- Установка параметров
ncb.ncb_command = NCBRESET;
ncb.ncb_lsn = 0;
ncb.ncb_lana_num = LANANUM;
ncb.ncb_callname[0] = MAX_SESSION;
ncb.ncb_callname[2] = MAX_NAMES;
//-------------- Вызов и проверка
uRetCode = Netbios((NCB*) &ncb );
if ( uRetCode != 0 )
{
cout << "error NCBRESET " << endl;
exit(1);
}
Следующим шагом надо добавить имя, только для начала его нужно сформировать учитывая правила NetBios. Сформированное имя необходимо поместить в переменную ncb_name структуры NCB
int i_strlen;
NCB ncb1;
memset(&ncb1, 0, sizeof (ncb1));
//---------------Создаем имя ----------------------
i_strlen = strlen(LOCALNAME);
if (i_strlen > NCBNAMSZ) i_strlen = NCBNAMSZ;
memset (ncb1.ncb_name, ' ', NCBNAMSZ);
memcpy (ncb1.ncb_name, LOCALNAME, i_strlen);
//--------- NetBios пораметры и запуск -------
ncb1.ncb_command = NCBADDNAME;
ncb1.ncb_lana_num = LANANUM;
uRetCode = Netbios((NCB*) &ncb1 );
if ( uRetCode != 0 )
{
cout << "error NCBADDNAME " << endl;
exit(1);
}
Теперь мы можем воспользоваться командой NCBASTAT для получения информации в массив ADAPTER_STATUS откуда извлекаем их используя массив NAME_BUFFER. В ncb_callname необходимо имя дистанционного приложения. Мы его сначала добавили, а потом использовали для получения статуса адаптера.
NCB ncb2;
ADAPTER_STATUS *pStatus;
memset (&ncb2, 0, sizeof (ncb2));
HANDLE hHeap;
int cbBuffer;
hHeap = GetProcessHeap();
cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER);
pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer);
//---------------
memset (ncb2.ncb_callname, ' ', NCBNAMSZ);
memcpy (ncb2.ncb_callname, LOCALNAME, i_strlen);
//---------------
ncb2.ncb_command = NCBASTAT;
ncb2.ncb_lana_num = LANANUM;
ncb2.ncb_buffer = (PUCHAR) pStatus;
ncb2.ncb_length = cbBuffer;
uRetCode = Netbios((NCB*) &ncb2 );
if ( uRetCode != 0 )
{
cout << "error NCBASTAT " << endl;
exit(1);
}
// ---- Все нормально
NAME_BUFFER *pNames;
pNames = (NAME_BUFFER *) (pStatus + 1);
for (int i = 0; i < pStatus->name_count; i++) printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name);
В результате работы программы на экране должно быть что-то типа этого, как ниже.
Если Вы не сможете сами, то загрузите проект. Мне пришлось всё это скомкать вместе из-за того, что nbstat я почему-то не нашел, но в следуюших шагах я постараюсь разделить этот проект на более понятные части.